#include "parser/system_tool_parser.h"

#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <ctime>
#include <sstream>
#include <algorithm>

#include "absl/container/flat_hash_map.h"
#include <glog/logging.h>

namespace sysinfo {
namespace monitor {

// 注意：构造函数已经在头文件中默认定义，不要在这里重复定义

bool SystemToolParser::Parse(const std::string& command_name, 
                             const std::string& output,
                             SystemInfoProto* system_info_proto) {
    if (!system_info_proto) {
        return false;
    }

    // 根据命令名称选择相应的解析方法
    if (command_name == "mpstat") {
        return ParseMpstat(output, system_info_proto);
    } else if (command_name == "pidstat") {
        return ParsePidstat(output, system_info_proto);
    } else if (command_name == "oncputime") {
        return ParseOncputime(output, system_info_proto);
    } else if (command_name == "profile") {
        return ParseProfile(output, system_info_proto);
    } else if (command_name == "profile-bpfcc") {
        return ParseProfileBpfcc(output, system_info_proto);
    } else if (command_name == "memstat") {
        return ParseMemstat(output, system_info_proto);
    } else if (command_name == "sar") {
        return ParseSar(output, system_info_proto);
    } else if (command_name == "tegrastats") {
        return ParseTegrastats(output, system_info_proto);
    } else if (command_name == "emc_log") {
        return ParseEmcLog(output, system_info_proto);
    } else if (command_name == "iostat") {
        return ParseIostat(output, system_info_proto);
    } else if (command_name == "oomkill") {
        return ParseOomkill(output, system_info_proto);
    }

    // 未知命令
    LOG(ERROR) << "Unknown command to parse: " << command_name;
    return false;
}

// 辅助函数：将输出按行分割，并保留原始的行尾格式。
// 如果原始行以换行符结尾，则结果中的对应行也包含换行符；
// 否则，结果中的对应行不包含额外的换行符。
std::vector<std::string> SplitOutputToLines(const std::string& output) {
    std::vector<std::string> lines;
    std::stringstream ss(output);
    std::string line;

    while (std::getline(ss, line)) {
        // 先为每一行添加换行符
        line += "\n";
        lines.push_back(line);
    }

    // 修正最后一行：如果原始输出不以换行符结尾，
    // 则说明最后一行是"开放的"，不应包含我们添加的换行符。
    if (!output.empty() && output.back() != '\n' && !lines.empty()) {
        lines.back().pop_back(); // 移除为最后一行添加的换行符
    }

    return lines;
}

bool SystemToolParser::ParseMpstat(const std::string& output, SystemInfoProto* system_info_proto) {
    // 实现mpstat命令输出解析
    LOG(INFO) << "Parsing mpstat output >> " << output;

    // 直接处理单行输出
    SystemToolResult* result = system_info_proto->add_tool_results();
    result->set_name("mpstat");

    // 设置时间戳
    time_t now = std::time(nullptr);
    result->set_timestamp(std::to_string(now));
    result->set_output(output);
    result->set_exit_code(0);

    return true;
}

bool SystemToolParser::ParsePidstat(const std::string& output, SystemInfoProto* system_info_proto) {
    // 实现pidstat命令输出解析
    SystemToolResult* result = system_info_proto->add_tool_results();
    result->set_name("pidstat");

    // 设置时间戳
    time_t now = std::time(nullptr);
    result->set_timestamp(std::to_string(now));
    result->set_output(output);
    result->set_exit_code(0);

    return true;
}

bool SystemToolParser::ParseOncputime(const std::string& output, SystemInfoProto* system_info_proto) {
    // 实现oncputime命令输出解析
    SystemToolResult* result = system_info_proto->add_tool_results();
    result->set_name("oncputime");
    
    // 设置时间戳
    time_t now = std::time(nullptr);
    result->set_timestamp(std::to_string(now));
    result->set_output(output);
    result->set_exit_code(0);
    
    return true;
}

bool SystemToolParser::ParseProfile(const std::string& output, SystemInfoProto* system_info_proto) {
    // 实现profile命令输出解析
    SystemToolResult* result = system_info_proto->add_tool_results();
    result->set_name("profile");
    
    // 设置时间戳
    time_t now = std::time(nullptr);
    result->set_timestamp(std::to_string(now));
    result->set_output(output);
    result->set_exit_code(0);
    
    return true;
}

bool SystemToolParser::ParseProfileBpfcc(const std::string& output, SystemInfoProto* system_info_proto) {
    LOG(INFO) << "Parsing profile-bpfcc output >> ......";
    // 实现profile-bpfcc命令输出解析
    SystemToolResult* result = system_info_proto->add_tool_results();
    result->set_name("profile-bpfcc");
    
    // 设置时间戳
    time_t now = std::time(nullptr);
    result->set_timestamp(std::to_string(now));
    
    // 直接将输出内容保存，不做额外解析
    result->set_output(output);
    result->set_exit_code(0);
    
    return true;
}

bool SystemToolParser::ParseMemstat(const std::string& output, SystemInfoProto* system_info_proto) {
    // 实现memstat命令输出解析
    SystemToolResult* result = system_info_proto->add_tool_results();
    result->set_name("memstat");
    
    // 设置时间戳
    time_t now = std::time(nullptr);
    result->set_timestamp(std::to_string(now));
    result->set_output(output);
    result->set_exit_code(0);
    
    return true;
}

bool SystemToolParser::ParseSar(const std::string& output, SystemInfoProto* system_info_proto) {
    // 实现sar命令输出解析
    SystemToolResult* result = system_info_proto->add_tool_results();
    result->set_name("sar");
    
    // 设置时间戳
    time_t now = std::time(nullptr);
    result->set_timestamp(std::to_string(now));
    result->set_output(output);
    result->set_exit_code(0);
    
    return true;
}

bool SystemToolParser::ParseTegrastats(const std::string& output, SystemInfoProto* system_info_proto) {
    // 实现tegrastats命令输出解析
    SystemToolResult* result = system_info_proto->add_tool_results();
    result->set_name("tegrastats");
    
    // 设置时间戳
    time_t now = std::time(nullptr);
    result->set_timestamp(std::to_string(now));
    result->set_output(output);
    result->set_exit_code(0);
    
    return true;
}

bool SystemToolParser::ParseEmcLog(const std::string& output, SystemInfoProto* system_info_proto) {
    // 实现emc_log命令输出解析
    SystemToolResult* result = system_info_proto->add_tool_results();
    result->set_name("emc_log");
    
    // 设置时间戳
    time_t now = std::time(nullptr);
    result->set_timestamp(std::to_string(now));
    result->set_output(output);
    result->set_exit_code(0);
    
    return true;
}

bool SystemToolParser::ParseIostat(const std::string& output, SystemInfoProto* system_info_proto) {
    // 实现iostat命令输出解析
    SystemToolResult* result = system_info_proto->add_tool_results();
    result->set_name("iostat");
    
    // 设置时间戳
    time_t now = std::time(nullptr);
    result->set_timestamp(std::to_string(now));
    result->set_output(output);
    result->set_exit_code(0);
    
    return true;
}

bool SystemToolParser::ParseOomkill(const std::string& output, SystemInfoProto* system_info_proto) {
    // 实现oomkill命令输出解析
    SystemToolResult* result = system_info_proto->add_tool_results();
    result->set_name("oomkill");
    
    // 设置时间戳
    time_t now = std::time(nullptr);
    result->set_timestamp(std::to_string(now));
    result->set_output(output);
    result->set_exit_code(0);
    
    return true;
}

}  // namespace monitor
}  // namespace sysinfo